import datetime

from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models

from customauth.models import MyUser


# модели справочников
# справочник подразделений
class Spr_lpu(models.Model):
    ter = models.PositiveSmallIntegerField(blank=False, default=0, verbose_name="код территории")
    lpu = models.PositiveSmallIntegerField(blank=False, default=0, verbose_name="код подразделения")
    name_lpu = models.CharField(max_length=100, blank=True, verbose_name="наименование подразделения")
    adress = models.CharField(max_length=100, blank=True, verbose_name="адрес подразделения")
    dred = models.DateField(auto_now_add=True)  # дата корректировки записи
    is_active = models.BooleanField(default=True)  # запись активна/не активна

    class Meta:
        verbose_name = "Подразделения"
        verbose_name_plural = "Подразделения"

    def __str__(self):
        return f"{self.id} {self.ter} {self.lpu} {self.name_lpu} {self.is_active}"


# справочник отделений
class Spr_otd(models.Model):
    otd = models.PositiveSmallIntegerField(blank=False, verbose_name="код Арена")
    name_otd = models.CharField(max_length=100, blank=True, verbose_name="наименование")
    name_otdkr = models.CharField(max_length=80, blank=True, verbose_name="краткое наименование")
    lpu = models.ForeignKey(Spr_lpu, on_delete=models.DO_NOTHING, verbose_name="подразделение")
    type_otd = models.PositiveSmallIntegerField(blank=False, default=0, verbose_name="тип отделения")
    dred = models.DateField(auto_now_add=True)  # дата корректировки записи
    is_active = models.BooleanField(default=True)  # запись активна/не активна

    class Meta:
        verbose_name = "Отделения"
        verbose_name_plural = "Отделения"

    def __str__(self):
        return f"{self.id} {self.otd} {self.name_otd} {self.lpu} {self.is_active}"


# справочник статусы должностей
# 1 - врач, 2 - средний мед.песонал, 3 - младший мед.персонал,  35 - зубной техник
class Spr_sdl(models.Model):
    sdl = models.PositiveSmallIntegerField(blank=False, unique=True, verbose_name="код Арена")
    name_sdl = models.CharField(max_length=100, blank=True, verbose_name="наименование")
    dred = models.DateField(auto_now_add=True)  # дата корректировки записи
    is_active = models.BooleanField(default=True)  # запись активна/не активна

    class Meta:
        verbose_name = "Статус должности"
        verbose_name_plural = "Статус должности"

    def __str__(self):
        return f"{self.id} {self.sdl} {self.name_sdl} {self.is_active}"


# справочник должностей
class Spr_dlj(models.Model):
    dlj = models.PositiveSmallIntegerField(blank=False, verbose_name="код Арена")
    name_dlj = models.CharField(max_length=100, blank=True, verbose_name="наименование")
    dred = models.DateField(auto_now_add=True)  # дата корректировки записи
    is_active = models.BooleanField(default=True)  # запись активна/не активна

    class Meta:
        verbose_name = "Должности"
        verbose_name_plural = "Должности"

    def __str__(self):
        return f"{self.id} {self.dlj} {self.name_dlj} {self.is_active}"


# справочник видов оплаты
class Spr_opl(models.Model):
    opl = models.PositiveSmallIntegerField(blank=False, unique=True, verbose_name="код")
    name_opl = models.CharField(max_length=50, blank=True, verbose_name="наименование")
    dred = models.DateField(auto_now_add=True)  # дата корректировки записи
    is_active = models.BooleanField(default=True)  # запись активна/не активна

    class Meta:
        verbose_name = "Виды оплаты"
        verbose_name_plural = "Виды оплаты"

    def __str__(self):
        return f"{self.opl} {self.name_opl} {self.is_active}"


# справочник причины отсутствия на рабочем месте
class Spr_nowork(models.Model):
    name_nowork = models.CharField(max_length=50, blank=True, verbose_name="наименование")
    dred = models.DateField(auto_now_add=True)  # дата корректировки записи
    is_active = models.BooleanField(default=True)  # запись активна/не активна

    class Meta:
        verbose_name = "Причины отсутствия на рабочем месте"
        verbose_name_plural = "Причины отсутствия на рабочем месте"

    def __str__(self):
        return f"{self.id} {self.name_nowork} {self.is_active}"


# сотрудники учреждения
class Spr_worker(models.Model):
    mpp = models.IntegerField(blank=False, validators=[MinValueValidator(0), MaxValueValidator(9999999)])
    fam = models.CharField(max_length=50, blank=False, verbose_name="Фамилия сотрудника")
    im = models.CharField(max_length=50, blank=False, verbose_name="Имя сотрудника")
    ot = models.CharField(max_length=50, blank=True, verbose_name="Отчество сотрудника")
    diplom = models.CharField(max_length=40, blank=True, verbose_name="Диплом")
    snils = models.CharField(max_length=40, blank=True, verbose_name="СНИЛС")
    telephone = models.CharField(max_length=40, blank=True, verbose_name="телефон")
    dred = models.DateField(default=datetime.date.today)  # дата корректировки записи
    is_active = models.BooleanField(default=True)  # запись активна/не активна

    class Meta:
        verbose_name = "Сотрудники учреждения"
        verbose_name_plural = "Сотрудники учреждения"

    def __str__(self):
        return f"worker:{self.id} fam:{self.fam} im:{self.im} ot:{self.ot} diplom:{self.diplom} snils:{self.snils} {self.is_active}"

    # def mpp_list(self):
    #     mpp_list = []
    #     mpp_list.append(self.id)
    #     if self.tech != 0 and self.tech is not None:
    #         mpp_list.append(self.tech)
    #     if self.lit != 0 and self.lit is not None:
    #         mpp_list.append(self.lit)
    #     if self.pol != 0 and self.pol is not None:
    #         mpp_list.append(self.pol)
    #     return mpp_list


# сотрудники учреждения + их должности
class Spr_worker_dlj(models.Model):
    class work_stavka(float, models.Choices):
        s025 = 0.25
        s050 = 0.50
        s075 = 0.75
        s1 = 1.00

    id_worker = models.ForeignKey(Spr_worker, on_delete=models.DO_NOTHING)
    doc = models.IntegerField(blank=False, verbose_name="Код из Арены")
    id_dlj = models.ForeignKey(Spr_dlj, on_delete=models.DO_NOTHING)
    id_lpu = models.ForeignKey(Spr_lpu, on_delete=models.DO_NOTHING)
    id_otd = models.ForeignKey(Spr_otd, on_delete=models.DO_NOTHING)
    id_sdl = models.ForeignKey(Spr_sdl, on_delete=models.DO_NOTHING)
    work_tip = models.IntegerField(validators=[MinValueValidator(1), MaxValueValidator(2)])
    stavka = models.FloatField(choices=work_stavka.choices)
    vid_priema = models.IntegerField(blank=True, default=0)
    doc_exp = models.IntegerField(blank=True, default=0)
    dred = models.DateField(default=datetime.date.today)  # дата корректировки записи
    is_active = models.BooleanField(default=True)  # запись активна/не активна

    class Meta:
        verbose_name = "Сотрудники учреждения по должностям"
        verbose_name_plural = "Сотрудники учреждения по должностям"
        ordering = ["id_worker"]

    @property
    def full_name(self):
        return "%s %s %s" % (self.id_worker.fam, self.id_worker.im, self.id_worker.ot)

    def nlpu(self):
        return "%s" % (self.id_lpu.name_lpu)

    def id_workerr(self):
        return "%s" % (self.id_worker.id)

    def __str__(self):
        return f"id:{self.id} id_worker:{self.id_worker} doc:{self.doc}"


# справочник смены нечетный/четный день
class Spr_smena(models.Model):
    name_smena = models.CharField(max_length=50, blank=False, verbose_name="смена")
    # ntime = models.FloatField(verbose_name="норма времени в месяц")
    dred = models.DateField(auto_now_add=True)  # дата корректировки записи
    is_active = models.BooleanField(default=True)  # запись активна/не активна

    class Meta:
        verbose_name = "Справочник смены нечетный/четный день"
        verbose_name_plural = "Справочник смены нечетный/четный день"

    def __str__(self):
        return f"{self.id} {self.name_smena}"


# модели данных
# график заголовок
class worker_grfo(models.Model):
    work_y = models.PositiveIntegerField(blank=False, verbose_name="год графика")
    work_m = models.PositiveIntegerField(blank=False, verbose_name="месяц графика")
    id_lpu = models.ForeignKey(Spr_lpu, on_delete=models.DO_NOTHING, verbose_name="подразделение")
    id_otd = models.ForeignKey(Spr_otd, on_delete=models.DO_NOTHING, verbose_name="отделение")
    id_opl = models.ForeignKey(Spr_opl, on_delete=models.DO_NOTHING, verbose_name="вид оплаты")
    dred = models.DateField(default=datetime.date.today)  # дата корректировки записи
    user_edit = models.ForeignKey(MyUser, on_delete=models.DO_NOTHING)


# график нормы времени по должностям
class worker_grfn(models.Model):
    class work_type(models.IntegerChoices):
        osn = 1
        sov = 2

    id_worker_grfo = models.ForeignKey(worker_grfo, on_delete=models.CASCADE)
    id_worker = models.ForeignKey(Spr_worker_dlj, on_delete=models.DO_NOTHING)
    id_dlj = models.ForeignKey(Spr_dlj, on_delete=models.DO_NOTHING)
    work_tip = models.IntegerField(choices=work_type.choices)
    ntime = models.FloatField()
    kdays = models.PositiveIntegerField()
    smena = models.ForeignKey(Spr_smena, on_delete=models.DO_NOTHING)
    dred = models.DateField(default=datetime.date.today)  # дата корректировки записи
    user_edit = models.ForeignKey(MyUser, on_delete=models.DO_NOTHING)


# график работы дни
class worker_grf(models.Model):
    id_worker_grfo = models.ForeignKey(worker_grfo, on_delete=models.CASCADE)
    id_worker_grfn = models.ForeignKey(worker_grfn, on_delete=models.DO_NOTHING)
    id_dlj = models.ForeignKey(Spr_dlj, on_delete=models.DO_NOTHING)
    work_y = models.PositiveIntegerField()
    work_m = models.PositiveIntegerField(
        blank=False, null=False, validators=[MinValueValidator(1), MaxValueValidator(12)],
    )
    work_d = models.PositiveIntegerField(
        blank=False, null=False, validators=[MinValueValidator(1), MaxValueValidator(31)],
    )
    work_date = models.DateField()
    range_times = models.CharField(max_length=40, blank=True, null=True, verbose_name="интервал времени")
    kol_times = models.FloatField()
    id_nowork = models.ForeignKey(Spr_nowork, on_delete=models.DO_NOTHING)
    dred = models.DateField(default=datetime.date.today)  # дата корректировки записи
    user_edit = models.ForeignKey(MyUser, on_delete=models.DO_NOTHING)


# class Container(models.Model):
#     used = models.BooleanField(
#         default=False, verbose_name="Занят", help_text="Занятый контейнер не отображается в пустых"
#     )
#     nkv = models.PositiveIntegerField(default=0, verbose_name=("Номер наряда"))

#     def __str__(self):
#         return f"{self.id}, used={self.used}, nkv={self.nkv}"

#     def get_info(self):
#         if self.nkv > 0:
#             naryad = It_lab.objects.get(nkv=self.nkv, id_etap=0)
#             if naryad.dzr is None:
#                 naryads = (
#                     It_lab.objects.filter(container=self, dzr__isnull=True, id_etap__gt=0)
#                     .select_related("user_etap_link")
#                     .order_by("nkv", "-id_etap")
#                     .distinct("nkv")
#                     .annotate()
#                 ).values(
#                     "nkv",
#                     "user_etap_link__fam",
#                     "user_etap_link__im",
#                     "user_etap_link__ot",
#                     "patient__fam",
#                     "patient__im",
#                     "patient__ot",
#                     "naryad_doc__user__fam",
#                     "naryad_doc__user__im",
#                     "naryad_doc__user__ot",
#                     "stu",
#                 )
#                 list_naryads = list(naryads)
#                 for nar in list_naryads:
#                     if nar["user_etap_link__fam"] is None:
#                         nar["user_etap_link__fam"] = "-"
#                         nar["user_etap_link__im"] = "-"
#                         nar["user_etap_link__ot"] = "-"
#                 return list_naryads
#         else:
#             return False
